/**
 * ISongService
 *
 * 主要职责：
 * - 歌曲上传、元数据管理、播放 URL 生成、搜索与统计
 *
 * 关键方法示例：
 * - Song upload(MultipartFile file, SongDto dto)
 * - String getSignedUrl(Long songId)
 *
 * 实现关注点：
 * - Minio 上传、签名 URL 生成、播放计数的聚合策略（Redis）
 *
 * 答辩要点：
 * - 大文件处理、签名 URL 的安全性、统计异步化
 */
package net.zjitc.yqmusicserver.service;

import com.baomidou.mybatisplus.extension.service.IService;
import jakarta.servlet.http.HttpServletRequest;
import net.zjitc.yqmusicserver.domain.Song;
import net.zjitc.yqmusicserver.domain.dto.SongAddDTO;
import net.zjitc.yqmusicserver.domain.dto.SongAndArtistDTO;
import net.zjitc.yqmusicserver.domain.dto.SongDTO;
import net.zjitc.yqmusicserver.domain.dto.SongUpdateDTO;
import net.zjitc.yqmusicserver.domain.vo.SongAdminVO;
import net.zjitc.yqmusicserver.domain.vo.SongDetailVO;
import net.zjitc.yqmusicserver.domain.vo.SongVO;
import net.zjitc.yqmusicserver.result.PageResult;
import net.zjitc.yqmusicserver.result.Result;

import java.util.List;

/**
 * <p>
 * 服务类
 * </p>
 *
 * @author 罗翼侨
 * @since 2025/06/16 21:09
 */
public interface ISongService extends IService<Song> {

    // 获取所有歌曲
    Result<PageResult<SongVO>> getAllSongs(SongDTO songDTO, HttpServletRequest request);

    // 获取所有歌曲
    Result<PageResult<SongAdminVO>> getAllSongsByArtist(SongAndArtistDTO songDTO);

    // 获取推荐歌曲
    Result<List<SongVO>> getRecommendedSongs(HttpServletRequest request);

    // 根据id获取歌曲详情
    Result<SongDetailVO> getSongDetail(Long songId, HttpServletRequest request);

    // 获取所有歌曲数量
    Result<Long> getAllSongsCount(String style);

    // 添加歌曲信息
    Result addSong(SongAddDTO songAddDTO);

    // 更新歌曲信息
    Result updateSong(SongUpdateDTO songUpdateDTO);

    // 更新歌曲封面
    Result updateSongCover(Long songId, String coverUrl);

    // 更新歌曲音频
    Result updateSongAudio(Long songId, String audioUrl);

    // 删除歌曲
    Result deleteSong(Long songId);

    // 批量删除歌曲
    Result deleteSongs(List<Long> songIds);

}
